package com.cnbm.wcsbasic.dispatch.taskPool;//package com.cnbm.wcsbasic.dispatch.taskPool;
//
//import org.fg.fgprotocol.s7.s7connector.enmuc.S7Client;
//import org.springframework.boot.ApplicationArguments;
//import org.springframework.boot.ApplicationRunner;
//import org.springframework.core.annotation.Order;
//import org.springframework.stereotype.Component;
//
//import java.io.BufferedReader;
//import java.io.IOException;
//import java.io.InputStreamReader;
//import java.time.LocalDateTime;
//import java.util.concurrent.TimeUnit;
//import java.util.regex.Matcher;
//import java.util.regex.Pattern;
//
///**
// * @Desc: "主要用于解决 ，设备突然断电，线程池中 存在死连接 的作用，因为 即使设备再通电，用 死连接 去read/write 会返回null"
// * @Author: caixiang
// * @DATE: 2024-01-22 15:20
// */
//@Component
//@Order(value = 1)
//public class HeartBeatTest implements ApplicationRunner {
//
//
//    public static boolean ping(String ipAddress, int pingTimes, int timeOut) {
//        BufferedReader in = null;
//        Runtime r = Runtime.getRuntime();  // 将要执行的ping命令,此命令是windows格式的命令
//        String pingCommand = "ping " + ipAddress + " -n " + pingTimes    + " -w " + timeOut;
//        try {   // 执行命令并获取输出
//            System.out.println(LocalDateTime.now().toString() +"   " +pingCommand);
//            Process p = r.exec(pingCommand);
//            if (p == null) {
//                return false;
//            }
//            in = new BufferedReader(new InputStreamReader(p.getInputStream(),"UTF-8"));   // 逐行检查输出,计算类似出现=23ms TTL=62字样的次数
//            int connectedCount = 0;
//            String line = null;
//            while ((line = in.readLine()) != null) {
//                connectedCount += getCheckResult(line);
//            }   // 如果出现类似=23ms TTL=62这样的字样,出现的次数=测试次数则返回真
//            return connectedCount == pingTimes;
//        } catch (Exception ex) {
//            ex.printStackTrace();   // 出现异常则返回假
//            return false;
//        } finally {
//            try {
//                in.close();
//            } catch (IOException e) {
//                e.printStackTrace();
//            }
//        }
//    }
//    //若line含有=18ms TTL=16字样,说明已经ping通,返回1,否則返回0.
//    private static int getCheckResult(String line) {  // System.out.println("控制台输出的结果为:"+line);
//        Pattern pattern = Pattern.compile("(\\d+ms)(\\s+)(TTL=\\d+)",    Pattern.CASE_INSENSITIVE);
//        Matcher matcher = pattern.matcher(line);
//        while (matcher.find()) {
//            return 1;
//        }
//        return 0;
//    }
//
//    @Override
//    public void run(ApplicationArguments args) throws Exception {
//
//        //public static ScheduledExecutorService heartBeatExecutorService =  Executors.newSingleThreadScheduledExecutor();
//        QGSThreadPool.heartBeatExecutorService.scheduleAtFixedRate(() -> {
//            try {
//                for(S7Client client:S7Client.values()){
//                    String host = client.getHost();
//                    if(!(client.clientPoolSize()==0)){
//                        if(!ping(host, 3, 300)){
//                            client.clearAll();
//                            System.out.println("心跳检测到 host："+host+"断开连接，现在清空 连接池");
//                        }
//                    }
//                }
//            } catch (Throwable e) {
//            }
//        },2,30, TimeUnit.SECONDS);
//    }
//}